home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 45
/
Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso
/
Aminet
/
game
/
role
/
ldmud-3.2-bin.lha
/
mud
/
doc
/
man2tex.awk
(
.txt
)
< prev
next >
Wrap
LaTeX Document
|
1999-03-31
|
4KB
|
108 lines
#! /usr/local/bin/gawk -f
# a simple example script to convert a manpage into a LaTeX section
# ToDo:
# - preserve line breaks and indentation in Examples
# - generate index entries for the section names
# - generate cross references for the See Also entries.
## The behaviour of GNU awk was changed somewhere between versions 2.15.0
## and 2.15.5, regarding the backslash and & in the gsub() invocations
## below. If you get ampersands instead of backslash-underscores in
## the output, you need to experiment with the second arg of the gsub()s,
## maybe add two more backslashes (making 6 in total)
## Pepel sighs deeply
# firts, substitute electrical characters
{ gsub(/\\/,"$\\backslash$");
gsub(/[_{}%&\#\^]/, "\\\\&");
gsub(/[<>]/,"$&$");
## gsub("\"","\\quote+\"+");
# gsub("\{", "\\{");
# gsub("\}", "\\}");
# print $0;
/^NAME|^CONCEPT/ { state = "name";
# getline line;
# split(line, name, "[ \t]+");
# gsub(/[_{}%&]/, "\\\\&", name[1]);
# printf("\\section{%s\\label{%s-section}}\n",
# name[1], name[1]);
# print line "\\\\";
next;
/^SYNOPSIS/ { state = "syn";
# getline line; name = line;
# ## gsub(/[ \t]+/," ",name);
# ## print l;
# sub(/^[ \t]*[a-z]+[ \t]+\**/,"", name);
# sub(/\([^)]*\)/,"()", name);
# sub(/\).*$/,")", name);
# gsub(/[_{}%&]/, "\\\\&", name);
# gsub(/[_{}%&]/, "\\\\&", line);
# # print name;
# printf("\\section{%s\\label{%s-section}}\n", name, name);
# print line "\\\\"
next;
/^LAST UPDATE/ { state = "X"; print "\\subsection*{Last Update}\n"; next; }
/^SEE ALSO/ { state = "see"; print "\\subsection*{See Also}\n"; next; }
/^EXAMPLE/ { state = "exm"; # EXAMPLE or EXAMPLES
printf("\\subsection*{%s%s}\n",
toupper(substr($1, 1, 1)),
tolower(substr($1, 2)));
next;
}
/^[A-Z]+/ { state = "X";
printf("\\subsection*{%s%s}\n",
toupper(substr($1, 1, 1)),
tolower(substr($1, 2)));
next;
# a match-all , again
{ if ("X" == state) { print $0; next; }
if ("name" == state) {
split($0, namename, "[ \t]+");
# gsub(/[_{}%&]/, "\\\\&", namename[1]);
label = namename[1];
if ("" == label) label = $0;
gsub(/[_(){}%&^~\#\\\\]/, "", label);
printf("\\section{%s\\label{%s-section}}\n%s\\\\\n",
$0, label, line);
next;
}
if ("see" == state) {
# print $0;
gsub(/[ ]/, "", $0);
nrefs = split($0, refs, ",");
for (i = 1; i < nrefs; i++) {
if (!length(refs[i])) continue;
seename = substr(refs[i], 1, index(refs[i], "(")-1);
printf("%s", refs[i]);
gsub(/[_(){}%&^~\\\\]/, "", seename);
if (length(seename))
printf(" (\\ref{%s-section})", seename);
printf(", ");
}
print "";
next;
}
if ("syn" == state) {
syname = $0;
sub(/^[ \t]*[a-z]+[ \t]+\**/,"", syname);
sub(/\([^)]*\)/,"()", syname);
sub(/\).*$/,")", syname);
# # print syname;
label = syname;
gsub(/[_(){}%&^~\\\\]/, "", label);
printf("\\section{{\\tt %s}\\label{%s-section}}\n",
syname, label);
printf("~~{\\tt %s}\\\\\n", $0);
state = "syn2";
next;
}
if ("syn2" == state) {
printf("~~{\\tt %s}\\\\\n", $0);
next;
}
# print the entire examples section in \tt and lines separated.
# we need some heuristic to distinguish betwwen code and explanatory lines
if ("exm" == state) {
printf("{\\tt %s}\\\\\n", $0);
next;
}
print "unknown state " state > /dev/stderr;